//
//  TjbShopOne.swift
//  jhf
//
//  Created by Mac on 2021/11/08 09:07:03.
//  Copyright © 2021 jhf. All rights reserved.
//
import Foundation
import UIKit
import Moya
import CryptoSwift
import SwiftyJSON
import CooperSwift

// LogPlugin(),
// SpinnerPlugin()
// EncryptPlugin()
// RequestAlertPlugin

let TjbShopOneProvider = MoyaProvider<TjbShopOne>(plugins: [SpinnerPlugin(), EncryptPlugin(), LogPlugin()])

   
public enum TjbShopOne {
     // 商品发布-获取分类列表
     /// 1. desc 排序的方向desc或者asc,默认为   desc string
     /// 2. orderByColumn 排序列,默认为    t.created_time  string
     /// 3. pageNum 当前记录起始索引,默认为  1 integer
     /// 4. pageSize 每页显示记录数,默认为   10 integer
     case mobCategoryPagelistall(Dictionary<String, Any>)

     // 关联品牌列表查询
     /// 1. categoryId 分类id integer
     /// 2. desc 排序的方向desc或者asc,默认为   desc string
     /// 3. orderByColumn 排序列,默认为    t.created_time  string
     /// 4. pageNum 当前记录起始索引,默认为  1 integer
     /// 5. pageSize 每页显示记录数,默认为   10 integer
     case mobCategoryPagelistcategorybrand(Dictionary<String, Any>)

     // 添加商品属性,有id为编辑
     /// 1. createdTime 创建日期 string
     /// 2. createdUser 创建人 integer
     /// 3. description 描述信息 string
     /// 4. id null integer
     /// 5. img sku图片 string
     /// 6. modifiedTime 修改日期 string
     /// 7. modifiedUser 修改人 integer
     /// 8. price 售价 number
     /// 9. realStock 库存 number
     /// 10. reduceStock 待减库存 number
     /// 11. reduceStockMode 减库存方式   1:销售立减  2:数量不变 integer
     /// 12. size 属性 string
     /// 13. spuId 商品spu id  integer
     /// 14. status 状态  0:下架   1:上架 integer
     /// 15. underlinePrice 市场价 number
     /// 16. valid 是否可用 1:可用,0不可用 integer
     case mobSkuAdd(Dictionary<String, Any>)

     // 删除商品属性
     /// 1. skuId 商品属性id ->  id integer ❤️
     /// 2. spuId 商品id -> spuId integer ❤️
     case mobSkuDelete(Int, Int)

     // 列表查询
     /// 1. desc 排序的方向desc或者asc,默认为   desc string
     /// 2. orderByColumn 排序列,默认为    t.created_time  string
     /// 3. pageNum 当前记录起始索引,默认为  1 integer
     /// 4. pageSize 每页显示记录数,默认为   10 integer
     /// 5. spuId SPU id integer
     case mobSkuPagelist(Dictionary<String, Any>)

     // 添加商品
     /// 1. auditStatus 审核状态 1:审核中，2：审核成功，3：审核失败 4待提交审核 integer
     /// 2. barcode 条码 string
     /// 3. brandId 品牌id integer
     /// 4. categoryId 二级商品类型id integer
     /// 5. createdTime 创建日期 string
     /// 6. createdUser 创建人 integer
     /// 7. description 描述信息 string
     /// 8. detailImgs 商品详情图片数组 array
     /// 9. emergency 是否应急商品  1:是 2:否 integer
     /// 10. failReasons 审核失败描述 string
     /// 11. id null integer
     /// 12. imgs 轮播图数组 array
     /// 13. modifiedTime 修改日期 string
     /// 14. modifiedUser 修改人 integer
     /// 15. name 名称 string
     /// 16. number 编号 string
     /// 17. oneCategoryId 一级商品类型id integer
     /// 18. status 状态 0 下架，1 上架 integer
     /// 19. storeId 店铺id integer
     /// 20. type 商品属性 1：应急商品 ....其他待定 string
     /// 21. valid 是否可用 1:可用,0不可用 integer
     case mobSpuAdd(Dictionary<String, Any>)

     // 批量-附件上传
     /// 1. files files array ❤️
     case mobSpuBatchupload(Array<Data>)

     // 收藏
     /// 1. id 商品id integer ❤️
     case mobSpuCollection(Int)

     // 我的收藏列表
     /// 1. desc 排序的方向desc或者asc,默认为   desc string
     /// 2. orderByColumn 排序列,默认为    t.created_time  string
     /// 3. pageNum 当前记录起始索引,默认为  1 integer
     /// 4. pageSize 每页显示记录数,默认为   10 integer
     /// 5. userId null integer
     case mobSpuCollectionlist(Dictionary<String, Any>)

     // 删除收藏
     /// 1. ids ids array
     case mobSpuDelcollection(Array<Int>?)

     // 删除
     case mobSpuDelete

     // 编辑商品
     /// 1. auditStatus 审核状态 1:审核中，2：审核成功，3：审核失败 4待提交审核 integer
     /// 2. barcode 条码 string
     /// 3. brandId 品牌id integer
     /// 4. categoryId 二级商品类型id integer
     /// 5. createdTime 创建日期 string
     /// 6. createdUser 创建人 integer
     /// 7. description 描述信息 string
     /// 8. detailImgs 商品详情图片数组 array
     /// 9. emergency 是否应急商品  1:是 2:否 integer
     /// 10. failReasons 审核失败描述 string
     /// 11. id null integer
     /// 12. imgs 轮播图数组 array
     /// 13. modifiedTime 修改日期 string
     /// 14. modifiedUser 修改人 integer
     /// 15. name 名称 string
     /// 16. number 编号 string
     /// 17. oneCategoryId 一级商品类型id integer
     /// 18. status 状态 0 下架，1 上架 integer
     /// 19. storeId 店铺id integer
     /// 20. type 商品属性 1：应急商品 ....其他待定 string
     /// 21. valid 是否可用 1:可用,0不可用 integer
     case mobSpuEdit(Dictionary<String, Any>)

     // 获取商品详情
     /// 1. id 商品id integer ❤️
     case mobSpuGetspudetail(Int)

     // 列表查询
     /// 1. auditStatus null integer
     /// 2. desc 排序的方向desc或者asc,默认为   desc string
     /// 3. emergency 是否应急商品  1:是 2:否 ,查全部不需要传此参数 integer
     /// 4. index  1:全部  2:售卖中  3:已下架   4:审核 integer
     /// 5. name 商品名称id条码 string
     /// 6. orderByColumn 排序列,默认为    t.created_time  string
     /// 7. pageNum 当前记录起始索引,默认为  1 integer
     /// 8. pageSize 每页显示记录数,默认为   10 integer
     /// 9. storeId 店铺id integer
     case mobSpuPagelist(Dictionary<String, Any>)

     // 提交审核
     case mobSpuSubmitaudit

     // 上下架
     /// 1. auditStatus 审核状态 1:审核中，2：审核成功，3：审核失败 4待提交审核 integer
     /// 2. barcode 条码 string
     /// 3. brandId 品牌id integer
     /// 4. categoryId 二级商品类型id integer
     /// 5. createdTime 创建日期 string
     /// 6. createdUser 创建人 integer
     /// 7. description 描述信息 string
     /// 8. emergency 是否应急商品  1:是 2:否 integer
     /// 9. failReasons 审核失败描述 string
     /// 10. id null integer
     /// 11. modifiedTime 修改日期 string
     /// 12. modifiedUser 修改人 integer
     /// 13. name 名称 string
     /// 14. number 编号 string
     /// 15. oneCategoryId 一级商品类型id integer
     /// 16. status 状态 0 下架，1 上架 integer
     /// 17. storeId 店铺id integer
     /// 18. type 商品属性 1：应急商品 ....其他待定 string
     /// 19. valid 是否可用 1:可用,0不可用 integer
     case mobSpuUpdn(Dictionary<String, Any>)

     // 附件上传
     /// 1. file file file ❤️
     case mobSpuUpload(Data)

     // 保存
     /// 1. a id ref
     /// 2. b 店铺状态 1：开店，2：关店 string
     case ecommerceProductSave(Int?, String?)

}
    

extension TjbShopOne: TargetType {
    
    public var method: Moya.Method {
        if ["ecommerce/product/mob/category/pageListAll", "ecommerce/product/mob/category/pageListCategoryBrand", "ecommerce/product/mob/sku/pageList", "ecommerce/product/mob/spu/pageList"].contains(self.path) {
            return .get
        }
        return .post
    }
    
    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }
    
    public var task: Task {
        var params: [String:Any] = [:]
        var formData: [MultipartFormData] = []
        switch self {
            case .mobCategoryPagelistall(let param):
            params = params.add(param)
            break
        case .mobCategoryPagelistcategorybrand(let param):
            params = params.add(param)
            break
        case .mobSkuAdd(let param):
            params = params.add(param)
            break
        case .mobSkuDelete(let skuId, let spuId):
            params["skuId"] = skuId
            params["spuId"] = spuId
            break
        case .mobSkuPagelist(let param):
            params = params.add(param)
            break
        case .mobSpuAdd(let param):
            params = params.add(param)
            break
        case .mobSpuBatchupload(let files):
            files.forEach { data in
                formData.append(MultipartFormData.init(provider: .data(data), name: "files", fileName: nil, mimeType: nil))
            }
            break
        case .mobSpuCollection(let id):
            params["id"] = id
            break
        case .mobSpuCollectionlist(let param):
            params = params.add(param)
            break
        case .mobSpuDelcollection(let ids):
            params["ids"] = ids
            break
        case .mobSpuDelete:
            break
        case .mobSpuEdit(let param):
            params = params.add(param)
            break
        case .mobSpuGetspudetail(let id):
            params["id"] = id
            break
        case .mobSpuPagelist(let param):
            params = params.add(param)
            break
        case .mobSpuSubmitaudit:
            break
        case .mobSpuUpdn(let param):
            params = params.add(param)
            break
        case .mobSpuUpload(let file):
            formData.append(MultipartFormData.init(provider: .data(file), name: "file", fileName: nil, mimeType: nil))
            break
        case .ecommerceProductSave(let a, let b):
            params["a"] = a
            params["b"] = b
            break
        
        }
        if ["ecommerce/product/mob/spu/upload"].contains(self.path) {
            return .uploadCompositeMultipart(formData, urlParameters: params)
        }
        return .requestParameters(parameters: params,
                                  encoding: URLEncoding.default)
    }
    
    public var headers: [String : String]? {
        let token = ["M-Token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyIiwic3ViIjoiMTgyMjIyMjIyMjIiLCJpYXQiOjE2MzU4MTcyNjEsInBob25lX3R5cGUiOjIsInVzZXJuYW1lIjoiMTgyMjIyMjIyMjIiLCJzaWduVXBUeXBlIjowfQ.qT5pJAPnkibt9shl6ZPYldh6m_kXmx3mYs-jMTsQmwI"]
        if ["ecommerce/product/mob/spu/upload"].contains(self.path) {
            return ["Content-type" : "multipart/form-data"].add(token)
        }
        return ["Content-type" : "application/x-www-form-urlencoded"].add(token)
    }
        
    public var baseURL: URL {
        return URL(string: "https://app.tiejiabang.com/product/")!
    }
    
    public var path: String {
        switch self {
            
          case .mobCategoryPagelistall:
            return "ecommerce/product/mob/category/pageListAll"
        
          case .mobCategoryPagelistcategorybrand:
            return "ecommerce/product/mob/category/pageListCategoryBrand"
        
          case .mobSkuAdd:
            return "ecommerce/product/mob/sku/add"
        
          case .mobSkuDelete:
            return "ecommerce/product/mob/sku/delete"
        
          case .mobSkuPagelist:
            return "ecommerce/product/mob/sku/pageList"
        
          case .mobSpuAdd:
            return "ecommerce/product/mob/spu/add"
        
          case .mobSpuBatchupload:
            return "ecommerce/product/mob/spu/batchUpload"
        
          case .mobSpuCollection:
            return "ecommerce/product/mob/spu/collection"
        
          case .mobSpuCollectionlist:
            return "ecommerce/product/mob/spu/collectionList"
        
          case .mobSpuDelcollection:
            return "ecommerce/product/mob/spu/delCollection"
        
          case .mobSpuDelete:
            return "ecommerce/product/mob/spu/delete"
        
          case .mobSpuEdit:
            return "ecommerce/product/mob/spu/edit"
        
          case .mobSpuGetspudetail:
            return "ecommerce/product/mob/spu/getSpuDetail"
        
          case .mobSpuPagelist:
            return "ecommerce/product/mob/spu/pageList"
        
          case .mobSpuSubmitaudit:
            return "ecommerce/product/mob/spu/submitAudit"
        
          case .mobSpuUpdn:
            return "ecommerce/product/mob/spu/upDn"
        
          case .mobSpuUpload:
            return "ecommerce/product/mob/spu/upload"
        
          case .ecommerceProductSave:
            return "ecommerce/product/save"
        }
    }
        
}
